Electronic systems and devices have made a significant contribution towards the advancement of modern society and are utilized in a number of applications to achieve advantageous results. Numerous electronic technologies such as digital computers, calculators, audio devices, video equipment, and telephone systems have facilitated increased productivity and reduced costs in analyzing and communicating data in most areas of business, science, education and entertainment. These electronic systems typically include numerous different components and can often attempt to provide various capabilities. However, adding various capabilities to a complex system can be complicated and traditional attempts at implementing various features (e.g., conventional attempts at utilizing virtual addresses across various components of a system, etc.) can have undesirable impacts.
Various systems (e.g. systems with discrete components, modern System On Chips (SOC's), etc.) typically have various different components that need access to memory to implement their desired functionality or operations. Many computing systems often have a central processing unit (CPU), a graphics processing unit (GPU), memory controller, and other peripheral controllers that can be on the same chip or separate discrete components. Both the GPU and the CPU often attempt to access the same physical dynamic random access memory (DRAM). However, typically the CPU has its own memory management unit (MMU) that the operating system (OS) sets up while the GPU has its own MMU that the GPU driver sets up. This potentially leads to a scenario where there are two distinct address spaces, one that is setup by the OS for the CPU and the other that is setup by the GPU driver for the GPU. These are often distinct virtual address (VA) spaces setup by different software components and can potentially lead to pointer collision or overlap. It is usually difficult to determine if a given particular virtual address (e.g., associated with a pointer, etc.) belongs to the CPU VA space, GPU VA space, or both. Some traditional attempts at resolving these issues are directed at having applications try to explicitly track which VA space a pointer belongs to.
The various conventional approaches that attempt to handle virtual addresses and pointer tracking typically have a number of problems. In some systems (e.g., on a 64 bit CPU, etc.) the VA space can be considered relatively large. Some traditional approaches attempt to reserve a large CPU VA chunk from the OS and have the GPU driver allocate only in this VA range. However, this approach often has a number of drawbacks including possible waste of CPU VA space if a large chunk is reserved initially but the actual amount of space that is required or utilized is much less. In some systems (e.g., on 32 bit CPU, etc.) the VA space can be considered relatively small. Given the total CPU VA space available is relatively small, reserving large chunks of CPU VA space for the GPU can result in less or inadequate VA space remaining available for operations of the other components (e.g., CPU, etc.) and can lead to lower system utilization.